home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1995 #5 & #6
/
Amiga Plus CD - 1995 - No. 5 and 6.iso
/
tex
/
macros
/
distribs
/
verbatim
/
verbatim.doc
< prev
next >
Wrap
Text File
|
1992-01-19
|
58KB
|
1,493 lines
\def\fileversion{v1.4i}
\def\filedate{92/01/20}
\def\docdate{91/12/18}
%% \CheckSum{446}
%% \CharacterTable
%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%% Digits \0\1\2\3\4\5\6\7\8\9
%% Exclamation \! Double quote \" Hash (number) \#
%% Dollar \$ Percent \% Ampersand \&
%% Acute accent \' Left paren \( Right paren \)
%% Asterisk \* Plus \+ Comma \,
%% Minus \- Point \. Solidus \/
%% Colon \: Semicolon \; Less than \<
%% Equals \= Greater than \> Question mark \?
%% Commercial at \@ Left bracket \[ Backslash \\
%% Right bracket \] Circumflex \^ Underscore \_
%% Grave accent \` Left brace \{ Vertical bar \|
%% Right brace \} Tilde \~}
%%
%
%\iffalse % this is a METACOMMENT !
%
%
%% Style-option `verbatim' to use with LaTeX v2.09
%% Copyright (C) 1989, 1990, 1991 by Rainer Sch\"opf, all rights reserved.
%
% Copying of this file is authorized only if either
% (1) you make absolutely no changes to your copy, including name, or
% (2) if you do make changes, you name it something other than
% verbatim.doc.
% This restriction helps ensure that all styles developed here
% remain identical.
%
%
% Error reports please to: R. Sch\"opf
% Konrad-Zuse-Zentrum
% f\"ur Informationstechnik Berlin
% Heilbronner Str.\ 10
% D-1000 Berlin 31
% Federal Republic of Germany
% Email: <SCHOEPF@SC.ZIB-Berlin.DE>
%
%
%\fi
%
% \changes{v1.4g}{91/11/21}{Several improvements in the documentation.}
% \changes{v1.4f}{91/08/05}{Corrected bug in documentation.
% Found by Bernd Raichle.}
% \changes{v1.4e}{91/07/24}{Avoid reading this file twice.}
% \changes{v1.4d}{91/04/24}{`penalty`interlinepenalty added to
% definition of `par in `@verbatim.
% Necessary to avoid page breaks in
% the scope of a `samepage declaration.}
% \changes{v1.4c}{90/10/18}{Added `leavevmode to definition of
% backquote macro.}
% \changes{v1.4b}{90/07/14}{Converted nearly all `verb's to \|...\|.}
% \changes{v1.4a}{90/04/04}{Added a number of percent characters
% to suppress blank space at the end of some code lines.}
% \changes{v1.4}{90/03/07}{`verb rewritten.}
%
% \changes{v1.3a}{90/02/04}{Removed {\tt verbatimwrite} environment
% from the code. Now only shown as an example.}
%
% \changes{v1.2g}{90/02/01}{Revised documentation.}
% \changes{v1.2e}{90/01/15}{Added `every@verbatim hook.}
% \changes{v1.2d}{89/11/29}{Use token register `@temptokena instead
% of macro `@tempb.}
% \changes{v1.2d}{89/11/29}{Use token register `verbatim@line instead
% of macro `@tempd.}
% \changes{v1.2b}{89/10/25}{`verbatimfile renamed to `verbatiminput.
% Suggested by Reinhard Wonneberger.}
%
% \changes{v1.1}{89/10/09}{Made the code more modular (as suggested by
% Chris Rowley): introduced
% `verbatim@addtoline, etc. Added
% `verbatimwrite environment.}
%
% \changes{v1.0e}{89/07/17}{Fixed bug in `verbatimfile (*-form
% handling, discovered by Dirk Kreimer).}
% \changes{v1.0d}{89/05/16}{Revised documentation, fixed silly bug
% in `verbatim@@@.}
% \changes{v1.0c}{89/05/12}{Added redefinition of `@sverb, change
% in end-of-line handling.}
% \changes{v1.0b}{89/05/09}{Change in `verbatim@rescan.}
% \changes{v1.0a}{89/05/07}{Change in `verbatim@@testend.}
%
%
% \DoNotIndex{\ ,\!,\C,\[,\\,\],\^,\`,\{,\},\~}
% \DoNotIndex{\@M,\@empty,\@flushglue,\@gobble,\@ifstar,\@ifundefined}
% \DoNotIndex{\@namedef,\@spaces,\@tempa,\@tempb,\@tempc,\@tempd}
% \DoNotIndex{\@temptokena,\@totalleftmargin,\@warning,\active}
% \DoNotIndex{\aftergroup,\begingroup,\catcode,\char,\csname,\def,\do}
% \DoNotIndex{\docdate,\dospecials,\edef,\else,\endcsname,\endgroup}
% \DoNotIndex{\endtrivlist,\expandafter,\fi,\filedate,\fileversion}
% \DoNotIndex{\frenchspacing,\futurelet,\gdef,\if,\ifcat}
% \DoNotIndex{\ifx,\immediate,\item,\kern,\lccode,\leftskip,\let}
% \DoNotIndex{\lowercase,\next,\noexpand,\parfillskip,\parindent}
% \DoNotIndex{\parskip,\penalty,\relax,\rightskip,\space,\string,\the}
% \DoNotIndex{\toks@,\trivlist,\tt,\typeout,\vskip,\write,\z@}
%
%
% \title{A New Implementation of \LaTeX{}'s \\ {\tt verbatim}
% and {\tt verbatim*} Environments\thanks{%
% This file has version number \fileversion{} dated \filedate.
% The documentation was last revised on \docdate.
% }}
%
% \author{Rainer Sch\"opf$\,$\thanks{ Many thanks to Chris Rowley
% from The Open University, UK, for looking this over,
% making a lot of useful suggestions, and discovering bugs.
% And many thanks to all the beta testers who tried this
% style file out.}\\
% Konrad-Zuse-Zentrum\\
% f\"ur Informationstechnik Berlin\\
% Heilbronner Str.\ 10\\
% W-1000 Berlin 31\\
% Federal Republic of Germany\\
% Internet: {\tt SCHOEPF@SC.ZIB-Berlin.DE}}
%
%
% \date{August 5, 1991}
%
% \markboth{Verbatim style option, version \fileversion, as of \filedate}
% {Verbatim style option, version \fileversion, as of \filedate}
%
% \maketitle
%
% \begin{abstract}
% This style option reimplements the \LaTeX{} {\tt verbatim} and
% {\tt verbatim*} environments.
% In addition it provides a {\tt comment} environment
% that skips any commands or text between
% |\begin{comment}|
% and the next |\end{comment}|.
% It also contains a redefinition of \LaTeX's |\verb| command
% to better detect the omission of the closing delimiter.
% \end{abstract}
%
% \section{Usage notes}
%
% \let\docDescribeMacro\DescribeMacro
% \let\docDescribeEnv\DescribeEnv
% \def\DescribeMacro#1{}
% \def\DescribeEnv#1{}
% \LaTeX's {\tt verbatim} and {\tt verbatim*} environments
% have a few features that may give rise to problems. These are:
% \begin{itemize}
% \item
% Since \TeX{} has to read all the text between the
% |\begin{verbatim}| and the |\end{verbatim}| before it can output
% anything, long verbatim listings may overflow \TeX's memory.
% \item
% Due to the method used to detect the closing |\end{verbatim}|
% (i.e.\ macro parameter delimiting) you cannot leave spaces
% between the |\end| token and |{verbatim}|.
% \end{itemize}
% Whereas the last of these points can be considered
% only a minor nuisance the other one is a real limitation.
%
%
% \DescribeEnv{verbatim}
% \DescribeEnv{verbatim*}
% This style file contains a reimplementation of the {\tt verbatim}
% and {\tt verbatim*} environments which overcomes these restrictions.
% There is, however, one incompatibility between the old and the
% new implementations of these environments: the old version
% would treat text on the same line as the |\end{verbatim}|
% command as if it were on a line by itself.
% {\bf This new version will simply ignore it.}\footnote{This is
% the price one has to pay for the removal of the old
% {\tt verbatim} environment's size limitations.}
% It will, however, issue a warning message of the form
% \begin{verbatim}
%LaTeX warning: Characters dropped
% after \end{verbatim*}!
%\end{verbatim}
% This is not a real problem since this text can easily be put
% on the next line without affecting the output.
%
% This new implementation also solves the second problem mentioned
% above: it is possible to leave spaces (but {\em not\/} end of line)
% between the |\end| and the |{verbatim}| or |{verbatim*}|:
% \begin{verbatim}
%\begin {verbatim*}
% test
% test
%\end {verbatim*}
%\end{verbatim}
%
% \DescribeEnv{comment}
% Additionally we introduce a {\tt comment} environment, with the
% effect that the text between |\begin{comment}| and |\end{comment}|
% is simply ignored, regardless of what it looks like.
% At first sight this seems to be quite different from the purpose
% of verbatim listing, but actually these two concepts turn out to be
% very similar.
% Both rely on the fact that the text between |\begin{...}| and
% |\end{...}| is read by \TeX{} without interpreting any commands or
% special characters.
% The remaining difference between {\tt verbatim} and {\tt comment} is
% only that the text is to be typeset in the former case and to be
% thrown away in the latter.
%
% \DescribeMacro{\verbatiminput}
% |\verbatiminput| is a command with one argument that inputs a file
% verbatim, i.e.\ the command |verbatiminput{xx.yy}|
% has the same effect as\\[2pt]
% \hspace*{\MacroIndent}|\begin{verbatim}|\\
% \hspace*{\MacroIndent}\meta{Contents of the file {\tt xx.yy}}\\
% \hspace*{\MacroIndent}|\end{verbatim}|\\[2pt]
% This command has also a |*|-variant that prints spaces as \verb*+ +.
%
%
% \StopEventually{}
%
%
% \section{Interfaces for style file designers}
%
% The {\tt verbatim} environment of \LaTeX{} version 2.09 does not
% offer a good interface to programmers.
% In contrast, this style file provides a simple mechanism to
% implement similar features, the {\tt comment} environment provided
% here being an example of what can be done and how.
%
%
% \subsection{Simple examples}
%
% It is now possible to use the {\tt verbatim} environment to define
% environments of your own.
% E.g.,
%\begin{verbatim}
% \newenvironment{myverbatim}%
% {\endgraf\noindent MYVERBATIM:%
% \endgraf\verbatim}%
% {\endverbatim}
%\end{verbatim}
% can be used afterwards like the {\tt verbatim} environment, i.e.
% \begin{verbatim}
%\begin {myverbatim}
% test
% test
%\end {myverbatim}
%\end{verbatim}
% Another way to use it is to write
% \begin{verbatim}
%\let\foo=\comment
%\let\endfoo=\endcomment
%\end{verbatim}
% and from that point on environment {\tt foo} is the same as the
% comment environment, i.e.\ everything inside its body is ignored.
%
% You may also add special commands after the |\verbatim| macro is
% invoked, e.g.
%\begin{verbatim}
%\newenvironment{myverbatim}%
% {\verbatim\myspecialverbatimsetup}%
% {\endverbatim}
%\end{verbatim}
% though you may want to learn about the hook |\every@verbatim| at
% this point.
% However, there are still a number of restrictions:
% \begin{enumerate}
% \item
% You must not use |\begin{verbatim}| inside a definition, e.g.
% \begin{verbatim*}
%\newenvironment{myverbatim}%
%{\endgraf\noindent MYVERBATIM:%
% \endgraf\begin{verbatim}}%
%{\end{verbatim}}
%\end{verbatim*}
% If you try this example, \TeX{} will report a
% ``runaway argument'' error.
% More generally, it is not possible to use
% |\begin{verbatim}|\ldots\allowbreak|\end{verbatim}|
% or the related environments in the definition of the new
% environment.
% \item
% You can{\em not\/} use the {\tt verbatim} environment inside
% user defined {\em commands}; e.g.,
% \changes{v1.4g}{91/11/21}{Corrcted wrong position of optional
% argument to `newcommand. Discovered by Piet van Oostrum.}
% \begin{verbatim*}
%\newcommand{\verbatimfile}[1]%
%{\begin{verbatim}%
% \input{#1}%
% \end{verbatim}}
%\end{verbatim*}
% does {\em not\/} work; nor does
% \begin{verbatim}
%\newcommand{\verbatimfile}[1]%
% {\verbatim\input{#1}\endverbatim}
%\end{verbatim}
% \item The name of the newly defined environment must not contain
% characters with category code other than $11$ (letter) or
% $12$ (other), or this will not work.
% \end{enumerate}
%
%
% \subsection{The interfaces}
%
% \DescribeMacro{\verbatim@font}
% Let us start with the simple things.
% Sometimes it may be necessary to use a special typeface for your
% verbatim text, or perhaps the usual computer modern typewriter shape
% in a reduced size.
%
% You may select this by redefining the macro |\verbatim@font|.
% This macro is executed at the beginning of every verbatim text to
% select the font shape.
% Do not use it for other purposes; if you find yourself abusing this
% you may want to read about the |\every@verbatim| hook below.
%
% By default, |\verbatim@font| switches to the typewriter font and
% disables the |?`| and |!`| ligatures.
%
%
% \DescribeMacro{\every@verbatim}
% \DescribeMacro{\addto@hook}
% There is a hook (i.e.\ a token register) called |\every@verbatim|
% whose contents are inserted into \TeX's mouth just before every
% verbatim text.
% Please use the |\addto@hook| macro to add something to this hook.
% It is used as follows:\\[2pt]
% \hspace*{\MacroIndent}|\addto@hook|\meta{name of the hook}\\
% \hspace*{\MacroIndent}\hspace*{\MacroIndent}^^A
% |{|\meta{commands to be added}|}|
% \vspace*{2pt}
%
%
%
% \DescribeMacro{\verbatim@start}
% After all specific setup, like switching of category codes, has been
% done, the |\verbatim@start|
% \newpage
% \onecolumn
% \begin{multicols}{2}
% \noindent
% macro is called.
% This starts the main loop of the scanning mechanism implemented here.
% Any other environment that wants to make use of this feature should
% call this macro as its last action.
%
%
% \DescribeMacro{\verbatim@startline}
% \DescribeMacro{\verbatim@addtoline}
% \DescribeMacro{\verbatim@processline}
% \DescribeMacro{\verbatim@finish}
% These are the things that concern the start of a verbatim
% environment.
% Once this (and other) setup has been done, the code in this style
% file reads and processes characters from the input stream in the
% following way:
% \begin{enumerate}
% \item Before it starts to read the first character of an input line
% the macro |\verbatim@startline| is called.
% \item After some characters have been read, the macro
% |\verbatim@addtoline| is called with these characters as its only
% argument.
% This may happen several times per line (when an |\end| command is
% present on the line in question).
% \item When the end of the line is reached, the macro
% |\verbatim@processline| is called to process the characters that
% |\verbatim@addtoline| has accumulated.
% \item Finally, there is the macro |\verbatim@finish| that is called
% just before the environment is ended by a call to the |\end|
% macro.
% \end{enumerate}
%
%
% To make this clear consider the standard {\tt verbatim} environment.
% In this case the three macros above are defined as follows:
% \begin{enumerate}
% \item |\verbatim@startline| clears the character buffer
% (a token register).
% \item |\verbatim@addtoline| adds its argument to the character
% buffer.
% \item |\verbatim@processline| typesets the characters accumulated
% in the buffer.
% \end{enumerate}
% With this it is very simple to implement the {\tt comment}
% environment:
% in this case |\verbatim@startline| and |\verbatim@processline| are
% no-ops whereas |\verbatim@addtoline| discards its argument.
%
%
% Another possibility is to define a variant of the |verbatim|
% environment that prints line numbers in the left margin.
% Assume that this would be done by a counter called |VerbatimLineNo|.
% Assuming that this counter was initialized properly by the
% environment, |\verbatim@processline| would be defined in this case as
% \begin{verbatim}
%\def\verbatim@processline{%
% \addtocounter{VerbatimLineNo}{1}%
% \leavevmode
% \llap{\theVerbatimLineNo
% \ \hskip\@totalleftmargin}%
% \the\verbatim@line\par}
%\end{verbatim}
%
% As a final nontrivial example we describe the definition of an
% environment called {\tt verbatimwrite}.
% It writes all text in its body to a file the name of which it is
% given as an argument.
% We assume that a stream number called |\verbatim@out| has already
% been reserved by means of the |\newwrite| macro.
%
% Let's begin with the definition of the macro |\verbatimwrite|.
% \begin{verbatim}
%\def\verbatimwrite#1{%
%\end{verbatim}
% First we call |\@bsphack| so that this environment does not influence
% the spacing.
% Then we open the file and set the category codes of all special
% characters:
% \begin{verbatim}
% \@bsphack
% \immediate\openout \verbatim@out #1
% \let\do\@makeother\dospecials
% \catcode`\^^M\active
%\end{verbatim}
% The default definitions of the macros
% \begin{verbatim}
% \verbatim@startline
% \verbatim@addtoline
% \verbatim@finish
%\end{verbatim}
% are also used in this environment.
% Only the macro |\verbatim@processline| has to be changed before
% |\verbatim@start| is called:
% \begin{verbatim}
% \def\verbatim@processline{%
% \immediate\write\verbatim@out
% {\the\verbatim@line}}%
% \verbatim@start}
%\end{verbatim}
% The definition of |\endverbatimwrite| is very simple:
% we close the stream and call |\@esphack| to get the spacing right.
% \begin{verbatim}
%\def\endverbatimwrite{%
% \immediate\closeout\verbatim@out
% \@esphack}
%\end{verbatim}
% \end{multicols}
%
% \newpage
% \SelfDocumenting
%
% \section{The implementation}
%
% \let\DescribeMacro\docDescribeMacro
% \let\DescribeEnv\docDescribeEnv
%
% \changes{v1.4e}{91/07/24}{Avoid reading this file twice.}
% The very first thing we do is to ensure that this file is not read
% in twice. To this end we check whether the macro |\verbatim@@@| is
% defined. If so, we just stop reading this file.
% \begin{macrocode}
\@ifundefined{verbatim@@@}{}{\endinput}
% \end{macrocode}
%
% We use a mechanism similar to the one implemented for the
% |\comment|\ldots\allowbreak|\endcomment| macro in \AmSTeX:
% We input one line at a time and check if it contains the |\end{...}|
% tokens.
% Then we can decide whether we have reached the end of the verbatim
% text, or must continue.
%
% As always we begin by identifying the latest version of this file on
% the VDU and in the transcript file.
% \begin{macrocode}
\typeout{Style-Option: `verbatim'
\fileversion \space <\filedate> (RmS)}
\typeout{English Documentation
\@spaces \@spaces \space <\docdate> (RmS)}
% \end{macrocode}
%
%
% \subsection{Preliminaries}
%
% \begin{macro}{\addto@hook}
% \changes{v1.2e}{90/01/15}{`addto@hook added.}
% We begin by defining a macro that adds tokens to a hook.
% The first argument is supposed to be a token register, the
% second consists of arbitrary \TeX{} text.
% \begin{macrocode}
\def\addto@hook#1#2{#1\expandafter{\the#1#2}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\every@verbatim}
% \changes{v1.2e}{90/01/15}{`every@verbatim hook added.}
% The hook (i.e.\ token register) |\every@verbatim|
% is initialized to \meta{empty}.
% \begin{macrocode}
\newtoks\every@verbatim
\every@verbatim={}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@makeother}
% \changes{v1.1a}{89/10/16}{`@makeother added.}
% |\@makeother| takes as argument a character and changes
% its category code to $12$ (other).
% \begin{macrocode}
\def\@makeother#1{\catcode`#112\relax}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@vobeyspaces}
% \changes{v1.1a}{89/10/16}{`@vobeyspaces added.}
% The macro |\@vobeyspaces| causes spaces in the input
% to be printed as spaces in the output.
% \begin{macrocode}
\begingroup
\catcode`\ =\active%
\gdef\@vobeyspaces{\catcode`\ \active\let \@xobeysp}%
\endgroup
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@xobeysp}
% \changes{v1.1a}{89/10/16}{`@xobeysp added.}
% The macro |\@xobeysp| produces exactly one space in
% the output, protected against breaking just before it.
% (|\@M| is an abbreviation for the number $10000$.)
% \begin{macrocode}
\def\@xobeysp{\leavevmode\penalty\@M\ }
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\verbatim@line}
% \changes{v1.2d}{89/11/29}{Introduced token register `verbatim@line.}
% We use a newly defined token register called |\verbatim@line|
% that will be used as the character buffer.
% \begin{macrocode}
\newtoks\verbatim@line
% \end{macrocode}
% \end{macro}
%
% The following four macros are defined globally in a way suitable for
% the {\tt verbatim} and {\tt verbatim*} environments.
% \begin{macro}{\verbatim@startline}
% \begin{macro}{\verbatim@addtoline}
% \begin{macro}{\verbatim@processline}
% |\verbatim@startline| initializes processing of a line
% by emptying the character buffer (|\verbatim@line|).
% \begin{macrocode}
\def\verbatim@startline{\verbatim@line{}}
% \end{macrocode}
% |\verbatim@addtoline| adds the tokens in its argument
% to our buffer register |\verbatim@line| without expanding
% them.
% \begin{macrocode}
\def\verbatim@addtoline#1{%
\verbatim@line\expandafter{\the\verbatim@line#1}}
% \end{macrocode}
% Processing a line inside a {\tt verbatim} or {\tt verbatim*}
% environment means printing it.
% \changes{v1.2c}{89/10/31}{Changed `@@par to `par in
% `verbatim@processline. Removed `leavevmode and `null
% (i.e.\ the empty `hbox).}
% Ending the line means that we have to begin a new paragraph.
% We use |\par| for this purpose. Note that |\par|
% is redefined in |\@verbatim| to force \TeX{} into horizontal
% mode and to insert an empty box so that empty lines in the input
% do appear in the output.
% \changes{v1.2f}{90/01/31}{Removed `verbatim@startline.}
% \begin{macrocode}
\def\verbatim@processline{\the\verbatim@line\par}
% \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\verbatim@finish}
% As a default, |\verbatim@finish| processes the remaining
% characters.
% When this macro is called we are facing the following problem:
% when the |\end{verbatim}|
% command is encountered |\verbatim@processline| is called
% to process the characters preceding the command on the same
% line. If there are none, an empty line would be output if we
% did not check for this case.
%
% If the line is empty |\the\verbatim@line| expands to
% nothing. To test this we use a trick similar to that on p.\ 376
% of the \TeX{}book, but with |$|\ldots|$| instead of
% the |!| tokens. These tokens can never have the same
% category code as those appearing in the token register
% |\verbatim@line| where |$| characters were read with
% category code $12$ (other).
% Note that |\ifcat| expands the following tokens so that
% |\the\verbatim@line| is replaced by the accumulated
% characters
% \changes{v1.2d}{89/11/29}{Changed `ifx to `ifcat test.}
% \changes{v1.1b}{89/10/18}{Corrected bug in if test (found by Chris).}
% \begin{macrocode}
\def\verbatim@finish{\ifcat$\the\verbatim@line$\else
\verbatim@processline\fi}
% \end{macrocode}
% \end{macro}
%
%
% \subsection{The {\tt verbatim} and {\tt verbatim*} environments}
%
% \begin{macro}{\verbatim@font}
% \changes{v1.2f}{90/01/31}{`@lquote macro removed.}
% \changes{v1.1b}{89/10/18}{`@noligs removed. Code inserted
% directly into `verbatim@font.}
% \changes{v1.1a}{89/10/16}{`verbatim@font added.}
% \changes{v1.1a}{89/10/16}{`@noligs added.}
% \changes{v1.1a}{89/10/16}{`@lquote added.}
% We start by defining the macro |\verbatim@font| that is
% to select the font and to set font-dependent parameters.
% For the default computer modern
% typewriter font ({\tt cmtt}) we have to avoid the
% ligatures !` and ?` (as produced by |!`| and |?`|).
% We do this by making the backquote |`| character active
% and defining it to insert an
% explicit kern before the backquote character.
% If the backquote character is the first character of the
% a {\tt verbatim} environment, \TeX{} is still in vertical
% mode.
% This means that the |\kern| command is processed in vertical mode
% and treated as a vertical kern.
% To avoid this, we use the |\leavevmode| macro.
% While the backquote character is active we cannot use it in a
% construction like
% |\catcode`|\meta{char}|=|\meta{number}.
% Instead we use the ASCII code of this character ($96$).
% \changes{v1.2f}{90/01/31}{`@lquote macro removed.}
% \changes{v1.4c}{90/10/18}{Added `leavevmode.}
% \begin{macrocode}
\begingroup
\catcode`\`=\active
\gdef\verbatim@font{\tt \catcode96\active
\def`{\leavevmode\kern\z@\char96 }}
\endgroup
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@verbatim}
% \changes{v1.1a}{89/10/16}{`@verbatim added.}
% The macro |\@verbatim| sets up things properly.
% First of all, the tokens of the |\every@verbatim| hook
% are inserted.
% Then a {\tt trivlist} environment is started and its first
% |\item| command inserted.
% Each line of the {\tt verbatim} or {\tt verbatim*}
% environment will be treated as a separate paragraph.
% \changes{v1.2e}{90/01/15}{Added `every@verbatim hook.}
% \begin{macrocode}
\def\@verbatim{\the\every@verbatim
\trivlist \item[]%
% \end{macrocode}
% \changes{v1.3c}{90/02/26}{Removed extra vertical space.
% Suggested by Frank Mittelbach.}
% The paragraph parameters are set appropriately:
% left and right margins, paragraph indentation, the glue to
% fill the last line and the vertical space between paragraphs.
% This has to be zero since we do not want to add extra space
% between lines.
% \begin{macrocode}
\leftskip\@totalleftmargin\rightskip\z@
\parindent\z@\parfillskip\@flushglue\parskip\z@
% \end{macrocode}
% \changes{v1.1b}{89/10/18}{Added resetting of `parshape
% if at beginning of a list.
% (Problem pointed out by Chris.)}
% There's one point to make here:
% the {\tt list} environment uses \TeX's |\parshape|
% primitive to get a special indentation for the first line
% of the list.
% If the list begins with a {\tt verbatim} environment
% this |\parshape| is still in effect.
% Therefore we have to reset this internal parameter explicitly.
% We could do this by assigning $0$ to |\parshape|.
% However, there is a simpler way to achieve this:
% we simply tell \TeX{} to start a new paragraph.
% As is explained on p.~103 of the \TeX{}book, this resets
% |\parshape| to zero.
% \changes{v1.1c}{89/10/19}{Replaced explicit resetting of `parshape
% by `@@par.}
% \begin{macrocode}
\@@par
% \end{macrocode}
% We now ensure that |\par| has the correct definition,
% namely to force \TeX{} into horizontal mode
% and to include an empty box.
% This is to ensure that empty lines do appear in the output.
% Afterwards, we insert the |\interlinepenalty| since \TeX{}
% does not add a penalty between paragraphs (here: lines)
% by its own initiative. Otherwise a |verbatim| environment
% could be broken across pages even if a |\samepage|
% declaration were present.
% \changes{v1.4d}{91/04/24}{`penalty`interlinepenalty added.
% Necessary to avoid page breaks in
% the scope of a `samepage declaration.}
% \changes{v1.2c}{89/10/31}{Definition of `par added.
% Ensures identical behaviour for
% verbatim and `verbatiminput.
% Problem pointed out by Chris.}
% \begin{macrocode}
\def\par{\leavevmode\null\@@par\penalty\interlinepenalty}%
% \end{macrocode}
% Now we call |\obeylines| to make the end of line character
% active,
% \begin{macrocode}
\obeylines
% \end{macrocode}
% switch to the font to be used,
% \begin{macrocode}
\verbatim@font
% \end{macrocode}
% and change the category code of all special characters
% to $12$ (other).
% \begin{macrocode}
\let\do\@makeother \dospecials}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\verbatim}
% \begin{macro}{\verbatim*}
% Now we define the toplevel macros.
% |\verbatim| is slightly changed:
% after setting up things properly it calls
% |\verbatim@start|.
% \begin{macrocode}
\def\verbatim{\@verbatim \frenchspacing\@vobeyspaces\verbatim@start}
% \end{macrocode}
% |\verbatim*| is defined accordingly.
% \begin{macrocode}
\@namedef{verbatim*}{\@verbatim\verbatim@start}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\endverbatim}
% \begin{macro}{\endverbatim*}
% To end the {\tt verbatim} and {\tt verbatim*}
% environments it is only necessary to finish the
% {\tt trivlist} environment started in |\@verbatim|.
% \begin{macrocode}
\let\endverbatim=\endtrivlist
\expandafter\let\csname endverbatim*\endcsname =\endtrivlist
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
% \subsection{The {\tt comment} environment}
%
% \begin{macro}{\comment}
% \begin{macro}{\endcomment}
% \changes{v1.1c}{89/10/19}{Added `@bsphack/`@esphack to the {\tt
% comment} environment. Suggested by Chris Rowley.}
% The |\comment| macro is similar to |\verbatim*|.
% However, we do not need to switch fonts or set special
% formatting parameters such as |\parindent| or |\parskip|.
% We need only set the category code of all special characters
% to $12$ (other) and that of |^^M| (the end of line character)
% to $13$ (active).
% The latter is needed for macro parameter delimiter matching in
% the internal macros defined below.
% In contrast to the default definitions used by the
% |\verbatim| and |\verbatim*| macros,
% we define |\verbatim@addtoline| to throw away its argument
% and |\verbatim@processline|, |\verbatim@startline|,
% and |\verbatim@finish| to act as no-ops.
% Then we call |\verbatim@|.
% But the first thing we do is to call |\@bsphack| so that
% this environment has no influence whatsoever upon the spacing.
% \changes{v1.1c}{89/10/19}{Changed `verbatim@start to
% `verbatim@. Suggested by Chris Rowley.}
% \changes{v1.1c}{89/10/19}{`verbatim@startline and
% `verbatim@finish are now
% also redefined to do nothing.}
% \begin{macrocode}
\def\comment{\@bsphack
\let\do\@makeother\dospecials\catcode`\^^M\active
\let\verbatim@startline\relax
\let\verbatim@addtoline\@gobble
\let\verbatim@processline\relax
\let\verbatim@finish\relax
\verbatim@}
% \end{macrocode}
% |\endcomment| is very simple: it only calls
% |\@esphack| to take care of the spacing.
% The |\end| macro closes the group and therefore takes care
% of restoring everything we changed.
% \begin{macrocode}
\let\endcomment=\@esphack
% \end{macrocode}
% \end{macro}
% \end{macro}
%
%
%
% \subsection{The main loop}
%
% Here comes the tricky part:
% During the definition of the macros we need to use the special
% characters |\|, |{|, and |}| not only with their
% normal category codes,
% but also with category code $12$ (other).
% We achieve this by the following trick:
% first we tell \TeX{} that |\|, |{|, and |}|
% are the lowercase versions of |!|, |[|, and |]|.
% Then we replace every occurrence of |\|, |{|, and |}|
% that should be read with category code $12$ by |!|, |[|,
% and |]|, respectively,
% and give the whole list of tokens to |\lowercase|,
% knowing that category codes are not altered by this primitive!
%
% But first we have ensure that
% |!|, |[|, and |]| themselves have
% the correct category code!
% \changes{v1.3b}{90/02/07}{Introduced `vrb@catcodes instead
% of explicit setting of category codes.}
% To allow special settings of these codes we hide their setting in
% the macro |\vrb@catcodes|. If it is already defined our new
% definition is skipped.
% \begin{macrocode}
\@ifundefined{vrb@catcodes}%
{\def\vrb@catcodes{%
\catcode`\!12\catcode`\[12\catcode`\]12}}{}
% \end{macrocode}
% This allows the use of this code for applications where other
% category codes are in effect.
%
% We start a group to keep the category code changes local.
% \begin{macrocode}
\begingroup
\vrb@catcodes
\lccode`\!=`\\ \lccode`\[=`\{ \lccode`\]=`\}
% \end{macrocode}
% \changes{v1.2f}{90/01/31}{Code for TABs removed.}
% We also need the end-of-line character |^^M|,
% as an active character.
% If we were to simply write |\catcode`\^^M=\active|
% then we would get an unwanted active end of line character
% at the end of every line of the following macro definitions.
% Therefore we use the same trick as above:
% we write a tilde |~| instead of |^^M| and
% pretend that the
% latter is the lowercase variant of the former.
% Thus we have to ensure now that the tilde character has
% category code $13$ (active).
% \begin{macrocode}
\catcode`\~=\active \lccode`\~=`\^^M
% \end{macrocode}
% The use of the |\lowercase| primitive leads to one problem:
% the uppercase character `|C|' needs to be used in the
% code below and its case must be preserved.
% So we add the command:
% \begin{macrocode}
\lccode`\C=`\C
% \end{macrocode}
% Now we start the token list passed to |\lowercase|.
% \begin{macrocode}
\lowercase{%
% \end{macrocode}
% Since this is done in a group all macro definitions are executed
% globally.
% \begin{macro}{\verbatim@start}
% The purpose of |\verbatim@start| is to check whether there
% are any characters on the same line as the |\begin{verbatim}|
% and to pretend that they were on a line by themselves.
% On the other hand, if there are no characters remaining
% on the current line we shall just find an end of line character.
% |\verbatim@start| performs its task by first grabbing the
% following character (its argument).
% This argument is then compared to an active |^^M|,
% the end of line character.
% \begin{macrocode}
\gdef\verbatim@start#1{%
\verbatim@startline
\if\noexpand#1\noexpand~%
% \end{macrocode}
% If this is true we transfer control to |\verbatim@|
% to process the next line. We use
% |\next| as the macro which will continue the work.
% \begin{macrocode}
\let\next\verbatim@
% \end{macrocode}
% Otherwise, we define |\next| to expand to a call
% to |\verbatim@| followed by the character just
% read so that it is reinserted into the text.
% This means that those characters remaining on this line
% are handled as if they formed a line by themselves.
% \begin{macrocode}
\else \def\next{\verbatim@#1}\fi
% \end{macrocode}
% Finally we call |\next|.
% \begin{macrocode}
\next}%
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\verbatim@}
% The three macros |\verbatim@|, |\verbatim@@|,
% and |\verbatim@@@| form the ``main loop'' of the
% {\tt verbatim} environment.
% The purpose of |\verbatim@| is to read exactly one line
% of input.
% |\verbatim@@| and |\verbatim@@@| work together to
% find out whether the four characters
% |\end| (all with category code $12$ (other)) occur in that
% line.
% If so, |\verbatim@@@| will call
% |\verbatim@test| to check whether this |\end| is
% part of |\end{verbatim}| and will terminate the environment
% if this is the case.
% Otherwise we continue as if nothing had happened.
% So let's have a look at the definition of |\verbatim@|:
% \changes{v1.1a}{89/10/16}{Replaced `verbatim@@@ by `@nil.}
% \begin{macrocode}
\gdef\verbatim@#1~{\verbatim@@#1!end\@nil}%
% \end{macrocode}
% Note that the |!| character will have been replaced by a
% |\| with category code $12$ (other) by the |\lowercase|
% primitive governing this code before the definition of this
% macro actually takes place.
% That means that
% it takes the line, puts |\end| (four character tokens)
% and |\@nil| (one control sequence token) as a
% delimiter behind it, and
% then calls |\verbatim@@|.
% \end{macro}
%
% \begin{macro}{\verbatim@@}
% |\verbatim@@| takes everything up to the next occurrence of
% the four characters |\end| as its argument.
% \begin{macrocode}
\gdef\verbatim@@#1!end{%
% \end{macrocode}
% That means: if they do not occur in the original line, then
% argument |#1| is the
% whole input line, and |\@nil| is the next token
% to be processed.
% However, if the four characters |\end| are part of the
% original line, then
% |#1| consists of the characters in front of |\end|,
% and the next token is the following character (always remember
% that the line was lengthened by five tokens).
% Whatever |#1| may be, it is verbatim text,
% so |#1| is added to the line currently built.
% \begin{macrocode}
\verbatim@addtoline{#1}%
% \end{macrocode}
% The next token in the input stream
% is of special interest to us.
% Therefore |\futurelet| defines |\next| to be equal
% to it before calling |\verbatim@@@|.
% \begin{macrocode}
\futurelet\next\verbatim@@@}%
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\verbatim@@@}
% \changes{v1.1a}{89/10/16}{Replaced `verbatim@@@ by
% `@nil where used as delimiter.}
% |\verbatim@@@| will now read the rest of the tokens on
% the current line,
% up to the final |\@nil| token.
% \begin{macrocode}
\gdef\verbatim@@@#1\@nil{%
% \end{macrocode}
% If the first of the above two cases occurred, i.e.\ no
% |\end| characters were on that line, |#1| is empty
% and |\next| is equal to |\@nil|.
% This is easily checked.
% \begin{macrocode}
\ifx\next\@nil
% \end{macrocode}
% If so, this was a simple line.
% We finish it by processing the line we accumulated so far.
% Then we prepare to read the next line.
% \changes{v1.2f}{90/01/31}{Added `verbatim@startline.}
% \begin{macrocode}
\verbatim@processline
\verbatim@startline
\let\next\verbatim@
% \end{macrocode}
% Otherwise we have to check what follows these |\end|
% tokens.
% \begin{macrocode}
\else
% \end{macrocode}
% Before we continue, it's a good idea to stop for a moment
% and remember where we are:
% We have just read the four character tokens |\end|
% and must now check whether the name of the environment (surrounded
% by braces) follows.
% To this end we define a macro called |\@tempa|
% that reads exactly one character and decides what to do next.
% This macro should do the following: skip spaces until
% it encounters either a left brace or the end of the line.
% But it is important to remember which characters are skipped.
% The |\end|\meta{optional spaces}|{| characters
% may be part of the verbatim text, i.e.\ these characters
% must be printed.
%
% Assume for example that the current line contains
% \begin{verbatim*}
% \end {AVeryLongEnvironmentName}
%\end{verbatim*}
% As we shall soon see, the scanning mechanism implemented here
% will not find out that this is text to be printed until
% it has read the right brace.
% Therefore we need a way to accumulate the characters read
% so that we can reinsert them if necessary.
% The token register |\@temptokena| is used for this purpose.
%
% Before we do this we have to get rid of the superfluous
% |\end| tokens at the end of the line.
% To this end we define a temporary macro whose argument
% is delimited by |\end\@nil| (four character tokens
% and one control sequence token)
% and use it on the rest of the line,
% after appending a |\@nil| token to it.
% This token can never appear in |#1|.
% We use the following definition of
% |\@tempa| to store the rest of the line (after the first
% |\end|) in token register |\toks@|
% which we shall use again in a moment.
% \begin{macrocode}
\def\@tempa##1!end\@nil{\toks@{##1}}%
\@tempa#1\@nil
% \end{macrocode}
% We mentioned already that we use token register
% |\@temptokena|
% to remember the characters we skip, in case we need them again.
% We initialize this with the |\end| we have thrown away
% in the call to |\@tempa|.
% \begin{macrocode}
\@temptokena{!end}%
% \end{macrocode}
% We shall now call |\verbatim@test|
% to process the characters
% remaining on the current line.
% But wait a moment: we cannot simply call this macro
% since we have already read the whole line.
% We stored its characters in token register |\toks@|.
% Therefore we use the following |\edef| to insert them again
% after the |\verbatim@test| token.
% A |^^M| character is appended to denote the end of the line.
% \changes{v1.2}{89/10/20}{Taken local definition of `@tempa out of
% `verbatim@@@ and introduced
% `verbatim@test instead.}
% \begin{macrocode}
\edef\next{\noexpand\verbatim@test\the\toks@\noexpand~}%
% \end{macrocode}
% That's almost all, but we still have to
% now call |\next| to do the work.
% \begin{macrocode}
\fi \next}%
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\verbatim@test}
% \changes{v1.2}{89/10/20}{Introduced `verbatim@test.}
% We define |\verbatim@test| to investigate every token
% in turn.
% \begin{macrocode}
\gdef\verbatim@test#1{%
% \end{macrocode}
% First of all we set |\next| equal to |\verbatim@test|
% in case this macro must call itself recursively in order to
% skip spaces.
% \begin{macrocode}
\let\next\verbatim@test
% \end{macrocode}
% We have to distinguish four cases:
% \begin{enumerate}
% \item The next token is a |^^M|, i.e.\ we reached
% the end of the line. That means that nothing
% special was found.
% Note that we use |\if| for the following
% comparisons so that the category code of the
% characters is irrelevant.
% \begin{macrocode}
\if\noexpand#1\noexpand~%
% \end{macrocode}
% We add the characters accumulated in token register
% |\@temptokena| to the current line. Since
% |\verbatim@addtoline| does not expand its argument,
% we have to do the expansion at this point. Then we
% |\let| |\next| equal to |\verbatim@|
% to prepare to read the next line.
% \changes{v1.2f}{90/01/31}{Added `verbatim@startline.}
% \begin{macrocode}
\expandafter\verbatim@addtoline
\expandafter{\the\@temptokena}%
\verbatim@processline
\verbatim@startline
\let\next\verbatim@
% \end{macrocode}
% \item A space character follows.
% This is allowed, so we add it to |\@temptokena|
% and continue.
% \begin{macrocode}
\else \if\noexpand#1
\@temptokena\expandafter{\the\@temptokena#1}%
% \end{macrocode}
% \changes{v1.2f}{90/01/31}{Code for TABs removed.}
% \item An open brace follows.
% This is the most interesting case.
% We must now collect characters until we read the closing
% brace and check whether they form the environment name.
% This will be done by |\verbatim@testend|, so here
% we let |\next| equal this macro.
% Again we will process the rest of the line, character
% by character.
% \changes{v1.2}{89/10/20}{Moved the initialization of
% `@tempc from `verbatim@testend into
% `verbatim@test.}
% The characters forming the name of the environment will
% be accumulated in |\@tempc|.
% We initialize this macro to expand to nothing.
% \changes{v1.3b}{90/02/07}{`noexpand added.}
% \begin{macrocode}
\else \if\noexpand#1\noexpand[%
\let\@tempc\@empty
\let\next\verbatim@testend
% \end{macrocode}
% Note that the |[| character will be a |{| when
% this macro is defined.
% \item Any other character means that the |\end| was part
% of the verbatim text.
% Add the characters to the current line and prepare to call
% |\verbatim@| to process the rest of the line.
% \changes{v1.0f}{89/10/09}{Fixed `end `end bug
% found by Chris Rowley}
% \begin{macrocode}
\else
\expandafter\verbatim@addtoline
\expandafter{\the\@temptokena}%
\def\next{\verbatim@#1}%
\fi\fi\fi
% \end{macrocode}
% \end{enumerate}
% The last thing this macro does is to call |\next|
% to continue processing.
% \begin{macrocode}
\next}%
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\verbatim@testend}
% |\verbatim@testend| is called when
% |\end|\meta{optional spaces}|{| was seen.
% Its task is to scan everything up to the next |}|
% and to call |\verbatim@@testend|.
% If no |}| is found it must reinsert the characters it read
% and return to |\verbatim@|.
% The following definition is similar to that of
% |\verbatim@test|:
% it takes the next character and decides what to do.
% \changes{v1.2}{89/10/20}{Removed local definition of `@tempa from
% `verbatim@testend which now
% does the work itself.}
% \begin{macrocode}
\gdef\verbatim@testend#1{%
% \end{macrocode}
% Again, we have four cases:
% \begin{enumerate}
% \item |^^M|: As no |}| is found in the current line,
% add the characters to the buffer. To avoid a
% complicated construction for expanding
% |\@temptokena|
% and |\@tempc| we do it in two steps. Then we
% continue with |\verbatim@| to process the
% next line.
% \changes{v1.2f}{90/01/31}{Added `verbatim@startline.}
% \begin{macrocode}
\if\noexpand#1\noexpand~%
\expandafter\verbatim@addtoline
\expandafter{\the\@temptokena[}%
\expandafter\verbatim@addtoline
\expandafter{\@tempc}%
\verbatim@processline
\verbatim@startline
\let\next\verbatim@
% \end{macrocode}
% \item |}|: Call |\verbatim@@testend| to check
% if this is the right environment name.
% \changes{v1.3b}{90/02/07}{`noexpand added.}
% \begin{macrocode}
\else\if\noexpand#1\noexpand]%
\let\next\verbatim@@testend
% \end{macrocode}
% \changes{v1.0f}{89/10/09}{Introduced check for {\tt\bslash} to fix
% single brace bug found by Chris Rowley}
% \item |\|: This character must not occur in the name of
% an environment. Thus we stop collecting characters.
% In principle, the same argument would apply to other
% characters as well, e.g., |{|.
% However, |\| is a special case, since it may be
% the first character of |\end|. This means that
% we have to look again for
% |\end{|\meta{environment name}|}|.
% Note that we prefixed the |!| by a |\noexpand|
% primitive, to protect ourselves against it being an
% active character.
% \changes{v1.3b}{90/02/07}{`noexpand added.}
% \begin{macrocode}
\else\if\noexpand#1\noexpand!%
\expandafter\verbatim@addtoline
\expandafter{\the\@temptokena[}%
\expandafter\verbatim@addtoline
\expandafter{\@tempc}%
\def\next{\verbatim@!}%
% \end{macrocode}
% \item Any other character: collect it and continue.
% We cannot use |\edef| to define |\@tempc|
% since its replacement text might contain active
% character tokens.
% \begin{macrocode}
\else \expandafter\def\expandafter\@tempc\expandafter
{\@tempc#1}\fi\fi\fi
% \end{macrocode}
% \end{enumerate}
% As before, the macro ends by calling itself, to
% process the next character if appropriate.
% \begin{macrocode}
\next}%
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\verbatim@@testend}
% Unlike the previous macros |\verbatim@@testend| is simple:
% it has only to check if the |\end{|\ldots|}|
% matches the corresponding |\begin{|\ldots|}|.
% \begin{macrocode}
\gdef\verbatim@@testend{%
% \end{macrocode}
% We use |\next| again to define the things that are
% to be done.
% Remember that the name of the current environment is
% held in |\@currenvir|, the characters accumulated
% by |\verbatim@testend| are in |\@tempc|.
% So we simply compare these and prepare to execute
% |\end{|\meta{current environment}|}|
% macro if they match.
% Before we do this we call |\verbatim@finish| to process
% the last line.
% We define |\next| via |\edef| so that
% |\@currenvir| is replaced by its expansion.
% Therefore we need |\noexpand| to inhibit the expansion
% of |\end| at this point.
% \begin{macrocode}
\ifx\@tempc\@currenvir
\verbatim@finish
\edef\next{\noexpand\end{\@currenvir}%
% \end{macrocode}
% Without this trick the |\end| command would not be able
% to correctly check whether its argument matches the name of
% the current environment and you'd get an
% interesting \LaTeX{} error message such as:
% \begin{verbatim}
%! \begin{verbatim*} ended by \end{verbatim*}.
%\end{verbatim}
% But what do we do with the rest of the characters, those
% that remain on that line?
% We call |\verbatim@rescan| to take care of that.
% Its first argument is the name of the environment just
% ended, in case we need it again.
% |\verbatim@rescan| takes the list of characters to be
% reprocessed as its second argument.
% (This token list was inserted after the current macro
% by |\verbatim@@@|.)
% Since we are still in an |\edef| we protect it
% by means of|\noexpand|.
% \begin{macrocode}
\noexpand\verbatim@rescan{\@currenvir}}%
% \end{macrocode}
% If the names do not match, we reinsert everything read up
% to now and prepare to call |\verbatim@| to process
% the rest of the line.
% \begin{macrocode}
\else
\expandafter\verbatim@addtoline
\expandafter{\the\@temptokena[}%
\expandafter\verbatim@addtoline
\expandafter{\@tempc]}%
\let\next\verbatim@
\fi
% \end{macrocode}
% Finally we call |\next|.
% \begin{macrocode}
\next}%
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\verbatim@rescan}
% In principle |\verbatim@rescan| could be used to
% analyse the characters remaining after the |\end{...}|
% command and pretend that these were read
% ``properly'', assuming ``standard'' category codes are in
% force.\footnote{Remember that they were all read with
% category codes $11$ (letter) and $12$ (other) so
% that control sequences are not recognized as such.}
% But this is not always possible (when there are unmatched
% curly braces in the rest of the line).
% Besides, we think that this is not worth the effort:
% After a {\tt verbatim} or {\tt verbatim*} environment
% a new line in the output is begun anyway,
% and an |\end{comment}| can easily be put on a line by itself.
% So there is no reason why there should be any text here.
% For the benefit of the user who did put something there
% (a comment, perhaps)
% we simply issue a warning and drop them.
% The method of testing is explained in Appendix~D, p.\ 376 of
% the \TeX{}book. We use |^^M| instead of the |!|
% character used there
% since this is a character that cannot appear in |#1|.
% The two |\noexpand| primitives are necessary to avoid
% expansion of active characters and macros.
%
% One extra subtlety should be noted here: remember that
% the token list we are currently building will first be
% processed by the |\lowercase| primitive before \TeX{}
% carries out the definitions.
% This means that the `|C|' character in the
% argument to the |\@warning| macro must be protected against
% being changed to `|c|'. That's the reason why we added the
% |\lccode`\C=`\C| assignment above.
% We can now finish the argument to |\lowercase| as well as the
% group in which the category codes were changed.
% \begin{macrocode}
\gdef\verbatim@rescan#1#2~{\if\noexpand~\noexpand#2~\else
\@warning{Characters dropped after `\string\end{#1}'}\fi}}
\endgroup
% \end{macrocode}
% \end{macro}
%
%
% \subsection{The {\tt\bslash verbatiminput} command}
%
% \begin{macro}{\verbatiminput}
% |\verbatiminput| first starts a group
% to keep font and category changes local.
% \begin{macrocode}
\def\verbatiminput{\begingroup
% \end{macrocode}
% The right sequence of actions is crucial here.
% First we must check if a star follows.
% Then we must read the argument (the file name).
% Finally we must set up everything to read the contents of the
% file verbatim.
% Therefore we must not start by calling |\@verbatim| to change
% font and the category code of characters.
% Instead we call one of the macros |\sverbatim@input| or
% |\verbatim@input|, depending on whether a star follows.
% \begin{macrocode}
\@ifstar\sverbatim@input\verbatim@input}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\sverbatim@input}
% |\sverbatim@input| reads the file name argument and sets up
% everything as in the |\verbatim| macro.
% Then it reads in the file, finishes off the {\tt trivlist}
% environment started by |\@verbatim| and closes the group
% opened in |\verbatiminput|.
% This restores everything to its normal settings.
% \changes{v1.2f}{90/01/31}{Added `@doendpe. Found by Erica Harris.}
% \changes{v1.1c}{89/10/19}{Forgotten `endtrivlist added.
% Found by Chris Rowley.}
% \begin{macrocode}
\def\sverbatim@input#1{\@verbatim
\@input{#1}\endtrivlist\endgroup\@doendpe}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\verbatim@input}
% |\verbatim@input| is nearly the same; it additionally calls
% |\frenchspacing| and |\@vobeyspaces| (as in
% |\verbatim| and |\verb|).
% \changes{v1.2f}{90/01/31}{Added `@doendpe. Found by Erica Harris.}
% \changes{v1.1c}{89/10/19}{Forgotten `endtrivlist added.
% Found by Chris Rowley.}
% \begin{macrocode}
\def\verbatim@input#1{\@verbatim
\frenchspacing \@vobeyspaces
\@input{#1}\endtrivlist\endgroup\@doendpe}
% \end{macrocode}
% \end{macro}
%
%
% \subsection{Redefinition of the {\tt \bslash verb} command.}
%
% The implementation here has the following advantage over that in
% the original \LaTeX: it will not accept the end of the input
% line being reached before the verbatim text has ended. Instead, it
% will end the verbatim text and generate an error message.
%
% \begin{macro}{\verb}
% \changes{v1.1a}{89/10/16}{`verb added.}
% We need special category codes during the definition:
% the end of line character (|^^M|) must be an active
% character. We do this in the same way as above:
% \changes{v1.4g}{91/11/21}{Changed `verb so that it works in math mode as well.
% Suggested by Chris Rowley and Bernd Raichle.}
% \begin{macrocode}
\begingroup
\catcode`\~=\active
\lccode`\~=`\^^M
% \end{macrocode}
% We use the following trick proposed by Bernd Raichle:
% The very first token in the list given to |\lowercase| is
% the |\endgroup| primitive. This means that it is processed by
% \TeX{} immediately after |\lowercase| is finished, thus ending
% the group started by |\begingroup| above.
% \begin{macrocode}
\lowercase{\endgroup
% \end{macrocode}
% The first thing we do in |\verb| is to check for math mode.
% If this is the case the |\bgroup| is used as open brace for the
% |\hbox|. Otherwise, we force horizontal mode and include an
% empty |\hbox| (|\null|). This is necessary in case the first
% character to be processed verbatim happens to be a space and
% if a line break occurs at this point. If we did not include
% the empty |\hbox| this space would disappear.
% \begin{macrocode}
\gdef\verb{\relax
\ifmmode \hbox \else \leavevmode\null \fi
\bgroup
% \end{macrocode}
% We use here
% |\verbatim@font| rather than switching directly to
% |\tt|.
% \begin{macrocode}
\verbatim@font
% \end{macrocode}
% Now we make the end of line character active and define it to
% restore everything back to normal and to signal an error.
% Remember that every occurence of the |~| character is changed
% into the end of line character.
% \changes{v1.4g}{91/11/21}{Changed control-m to tilde in category
% code assignment, as it is converted to control-m
% by the `lowercase primitive. This improves the
% readability. Suggested by Bernd Raichle.}
% \changes{v1.4b}{90/07/14}{Added `catcode assignment that had
% disappeared somehow.}
% \begin{macrocode}
\catcode`~\active
\def~{\egroup\@latexerr{\string\verb\space command ended by
end of line.}\@ehc}%
% \end{macrocode}
% The rest is copied from {\tt latex.tex} where we have replaced
% one macro (|\@verb|) by its expansion.
% \changes{v1.3a}{90/02/04}{Removed unnecessary braces.}
% \changes{v1.4}{90/03/07}{Replaced `@verb by its expansion.}
% \begin{macrocode}
\let\do\@makeother \dospecials
\@ifstar\@sverb{\@vobeyspaces \frenchspacing \@sverb}}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@sverb}
% \changes{v1.4h}{91/12/18}{Changed `@sverb so that `verb would work
% in a tabular or array environment.}
% \changes{v1.4i}{92/01/20}{Errors corrected.}
% |\@sverb| gains control when we are ready to look for the
% delimiting character. It reads it and defines this character
% to be equivalent to |\egroup|, i.e., to a closing brace.
% That means it will restore everything to normal when it occurs for
% the second time.
% \begin{macrocode}
\def\@sverb#1{%
\catcode`#1\active
\lccode`\~`#1%
\lowercase{\let~\egroup}}%
% \end{macrocode}
% \end{macro}
%
% \Finale
%
\endinput